perm filename REFORM.SAI[4,KMC]1 blob sn#177272 filedate 1975-09-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	INDEX makes an index from STAMPS
C00004 00003	α MAKE_LABELS makes labels from STAMPS.IND
C00006 00004	α BUBBLE arranges an ATLAS by longitude or latitude
C00010 00005	α This selects the requested routine
C00011 ENDMK
C⊗;
COMMENT INDEX makes an index from STAMPS;

BEGIN

REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;

PROC INDEX;
	BEGIN
	STRING ARRAY LOC[0:5];
	STRING LINE;
	SETBREAK(2, TAB, NULL, "XNR");
	SETBREAK(3, "←→", NULL, "INS");
	SETBREAK(4, "@", NULL, "INS");
	FILIN("STAMPS[SEC,RCP]", INCH1);
	FILOUT("STAMPS.IND[SEC,RCP]", OUCH1);
	EAT_DIR(LINE, INCH1);
	WHILE (LINE ← IN_LINE) DO
		BEGIN
		STRING TABS, REST, LEAD, REALLY;
		INTEGER BRK2;
		TABS ← SCAN(LINE, 2, BRK);
		LOC[LN(TABS)] ← LINE;
		LINE ← LINE ∂ "→ ";
		REST ← NULL;
		FOR I ← LN(TABS)-1 STEP -1 UNTIL 1 DO
			REST ← REST ∂ " ⊂ " ∂ LOC[I];
		BRK ← "←";
		WHILE BRK = "←" DO
			BEGIN
			OUT_LINE(LINE[1 TO ∞-3] & REST);
			LEAD ← SCAN(LINE, 3, BRK);
			LINE ← LINE[2 TO ∞] & LEAD & "→ ";
			REALLY ← SCAN(LEAD, 4, BRK2);
			IF BRK2 = "@" THEN OUT_LINE(LEAD[2 TO ∞] & "@" ∂ REALLY);
			END;
		END;
	RELEASE(INCH1);
	RELEASE(OUCH1);
	END;
α MAKE_LABELS makes labels from STAMPS.IND;

PROC MAKE_LABELS;
	BEGIN
	STRING LINE;
	SETBREAK(2, "⊂", NULL, "INS");
	SETBREAK(3, "←→@⊂#", NULL, "INS");
	FILIN("STAMPS.IND[SEC,RCP]", INCH1);
	FILOUT("STAMPS.LAB[SEC,RCP]", OUCH1);
	EAT_DIR(LINE, INCH1);
	WHILE (LINE ← IN_LINE) DO
		BEGIN
		STRING LEAD, REALLY;
		REALLY ← LEAD ← SCAN(LINE, 2, BRK);
		REALLY ← SCAN(REALLY, 3, BRK);
		IF BRK ≠ "#" THEN
			BEGIN
			BLANKS ← NULL;
			DO	BEGIN
				OUT_LINE(BLANKS & LEAD);
				LEAD ← SCAN(LINE, 2, BRK);
				BLANKS ← BLANKS & " ";
				END
			UNTIL ¬LEAD;
			OUT_LINE(NULL);
			END;
		END;
	RELEASE(INCH1);
	RELEASE(OUCH1);
	END;
α BUBBLE arranges an ATLAS by longitude or latitude;

PROC BUBBLE;
	BEGIN
	SAFE STRING ARRAY WORDS [1:300];
	SAFE INTEGER ARRAY LATS [1:300, 0:1];
	INTEGER SIZE, USE_LAT, MAX_SIZE;
	INTEGER MIN_LONG, MAX_LONG, MIN_LAT, MAX_LAT;
	BOOLEAN CLOSE_UP;
	STRING NEXT;
	MAX_SIZE ← 300;
	BREAK_TAB;
	BREAK_EXT;
	FILIN((FILE ← GET_A_STRING("Sort which ATLAS")), INCH1);
	IF (NEXT ← GET_A_STRING("What region do you want [<CR> for all]")) THEN
		BEGIN
		STRING TEMP;
		CLOSE_UP ← TRUE;
		TEMP ← GET_A_STRING("West-most longitude");
		MIN_LONG ← SCAN_LONG(TEMP);
		TEMP ← GET_A_STRING("East-most longitude");
		MAX_LONG ← SCAN_LONG(TEMP);
		TEMP ← GET_A_STRING("North-most latitude");
		MIN_LAT ← -SCAN_LAT(TEMP);
		TEMP ← GET_A_STRING("South-most latitude");
		MAX_LAT ← -SCAN_LAT(TEMP);
		FILE ← NEXT;
		END
	ELSE	CLOSE_UP ← FALSE;
	USE_LAT ← (IF GET_A_STRING("Sort by Longitude [Y,N]") = "Y" THEN 0 ELSE 1);
	SIZE ← 0;
	EOF ← FALSE;
	WHILE ¬EOF AND (SIZE < MAX_SIZE) DO
		BEGIN
		INTEGER J;
		SAFE INTEGER ARRAY LAT[0:1];
		STRING CITY, TEMP;
		IF ¬(NEXT ← IN_LINE) THEN CONTINUE;
		CITY ← NEXT;
		TEMP ← SCAN(NEXT, 3, BRK);
		LAT[0] ← SCAN_LONG(NEXT);
		LAT[1] ← -SCAN_LAT(NEXT);
		IF CLOSE_UP AND (LAT[0] < MIN_LONG OR LAT[0] > MAX_LONG OR
			LAT[1] < MIN_LAT OR LAT[1] > MAX_LAT) THEN CONTINUE;
		SIZE ← SIZE + 1;
		J ← SIZE;
		WHILE ((J ← J-1) ≥ 1) AND LAT[USE_LAT] < LATS[J, USE_LAT] DO
			BEGIN
			WORDS[J+1] ← WORDS[J];
			FOR I ← 0 TIL 1 DO LATS[J+1, I] ← LATS[J, I];
			END;
		WORDS[J+1] ← CITY;
		FOR I ← 0 TIL 1 DO LATS[J+1, I] ← LAT[I];
		END;
	IF ¬EOF THEN OUTSTR("Only first" ∂ CVS(MAX_SIZE) ∂ "entries sorted." ↓)
	ELSE OUTSTR("There were" ∂ CVS(SIZE) ∂ "cities." ↓);
	RELEASE(INCH1);
	FILOUT(SCAN(FILE, 7, BRK) & (IF USE_LAT THEN ".LAT" ELSE ".LON"), OUCH1);
	FOR I ← 1 TIL SIZE DO OUT_LINE(WORDS[I]);
	RELEASE(OUCH1);
	END;
α This selects the requested routine;

WHILE TRUE DO
	BEGIN
	STRING JOB;
	BREAK_LINE;
	JOB ← GET_A_STRING("Index, Labels, Sort atlas, eXit");
	     IF JOB = "I" THEN INDEX
	ELSE IF JOB = "L" THEN MAKE_LABELS
	ELSE IF JOB = "S" THEN BUBBLE
	ELSE IF JOB = "X" THEN DONE
	ELSE OUTSTR("You blew it" ↓);
	END;

END